from threading import Thread, Lock, current_thread
import time

lock = Lock()

# 根据下标在列表中取值，保证同一时刻只能有一个线程取值
my_list = [1, 2, 3, 4, 5, 6]


# 这里有死锁，因为return 没有释放锁
# def get_value(index):
#     lock.acquire()
#     print(f'当前线程是：{current_thread()}')
#     # 判断下标是否越界
#     if index >= len(my_list):
#         print(f'下标越界了，你传入的下标是：{index}')
#         return
#     v = my_list[index]
#     print(f'当前现场取到的值是{v}')
#     time.sleep(0.4)
#     lock.release()

# 使用with语句 自动释放资源
# def get_value(index):
#     with lock:
#         print(f'当前线程是：{current_thread()}')
#         # 判断下标是否越界
#         if index >= len(my_list):
#             print(f'下标越界了，你传入的下标是：{index}')
#             return
#         v = my_list[index]
#         print(f'当前现场取到的值是{v}')
#         time.sleep(0.4)
#
#
# if __name__ == '__main__':
#     # 创建20个线程模拟多线程从列表中取值操作
#     for i in range(20):
#         t = Thread(target=get_value, args=(i,))
#
#         t.start()

# 总结
#     线程是依附在进程里面的，没有进程就没有线程
#     一个进程默认提供一条线程，进程可以创建多个线程

# 区别
#     进程之间不共享全局变量
#         线程之间共享全局变量，但是要注意资源竞争的问题，解决办法 采用互斥锁和线程同步
#         创建进程的资源开销要比创建线程的资源开销要大
#             进程是操作系统资源分配的基本单位 线程是cpu调度的基本单位
#             线程不能独立运行，必须依存在进程中
#             多进程开发比单进程多线程开发稳定性要强

# 进程优点 可以用多核 缺点 资源开销大
# 线程优点 资源开销小 缺点 不能用多核
